using System;
using System.Collections;
using System.Collections.Generic;
using HR60_PanelSoft.Model;
using HR60_PanelSoft.Model.BaseModel;

namespace HR60_PanelSoft.Service
{
    //GC: [g1]执行业务约束[DeviceService]
    //GC: [g2]设备的删除逻辑[DeviceService]
    //GC: [g3]分机数量监测[DeviceService]
    //GC: [g4]智能终端逻辑优化[DeviceService]
    //GC: [g5]bug2185/2186/2187[DeviceService]
    //GC: [g6]bug3091[DeviceService]
    //GC: [g7]opt:优化所有删除动作[DeviceService]
    
	public class DeviceService : CommonService
	{
        /* [g1.s1] 业务约束因子 */
        protected static int MaxExTypeInProc = 1; //高级类型设备
        /* [g1.s3] 多楼层机 */
        protected static int MaxMultiFloorMain = 1; //多楼层主机
        protected static int MaxMultiFloorSlave = 7; //多楼层从机
        /*  end of  [g1.s3] */

        /* [g3.s3] */
        protected static int MaxACSub = 32;
        protected static int MaxWindSub = 8;
        protected static int MaxHeatSub = 8;
        protected static int MaxBGMSub = 8;
        /* end of [g3.s3] */

        #region 废弃IsCanNew

        //public static bool IsCanNew(HR60_PanelSoft.Model.BaseModel.RefModel ins)
        //{
        //    bool rst = true;
        //    int tempExNum = 0;
        //    /* [g1.s4] 多楼层机 */
        //    int tempMfmNum = 0, tempMfsNum = 0;
        //    /* end of [g1.s4] */
        //    Device dev = (Device)ins;

        //    foreach (DeviceGroup dg in proj.deviceGroups)
        //    {
        //        foreach (Device d in dg.devices)
        //        {
        //            if (d.type.exType == dev.type.exType && dev.type.exType != ExDeviceType.NULL)
        //            {
        //                tempExNum++;
        //                if (tempExNum >= MaxExTypeInProc)
        //                    return false;
        //                else
        //                    continue;
        //            }

        //            //if(d.type.name == "多楼层主机")
        //            //{
        //            //    tempMfmNum++;
        //            //    if (tempMfmNum > MaxMultiFloorMain)
        //            //    {
        //            //        //GCERR:
        //            //        return false;
        //            //    }
        //            //    else if(tempMfmNum == MaxMultiFloorMain)
        //            //        return false;
        //            //    return true;
        //            //}
        //            //else if (d.type.name == "多楼层从机")
        //            //{
        //            //    tempMfsNum++;
        //            //    if (tempMfsNum > MaxMultiFloorSlave)
        //            //    {
        //            //        //GCERR:
        //            //        return false;
        //            //    }
        //            //    else if (tempMfsNum == MaxMultiFloorSlave)
        //            //        return false;
        //            //    return true;
        //            //}
        //            switch (dev.type.name)
        //            {
        //                /* [g1.s5] */
        //                case "多楼层主机":
        //                    if (d.type.name == "多楼层主机")
        //                    {
        //                        tempMfmNum++;
        //                        if (tempMfmNum > MaxMultiFloorMain)
        //                        {
        //                            //GCERR:
        //                            return false;
        //                        }
        //                        else if (tempMfmNum == MaxMultiFloorMain)
        //                            return false;
        //                        continue;
        //                    }
        //                    break;
        //                case "多楼层从机":
        //                    if (d.type.name == "多楼层从机")
        //                    {
        //                        tempMfsNum++;
        //                        if (tempMfsNum > MaxMultiFloorSlave)
        //                        {
        //                            //GCERR:
        //                            return false;
        //                        }
        //                        else if (tempMfsNum == MaxMultiFloorSlave)
        //                            return false;
        //                        continue;
        //                    }
        //                    break;
        //                /* end of [g1.s5] */
        //                case "智能终端（灯光窗帘）":
                            
        //                    break;
        //                case "智能终端（全部功能）":
        //                    break;
        //                default:
        //                    break;

        //            }
        //        }
        //    }
        //    return rst;
        //}
        #endregion
        /* end of [g1.s1] */

		public static Device findByUuid(string uuid)
		{
			foreach (DeviceGroup group in proj.deviceGroups)
			{
				foreach (Device device in group.devices)
				{
					if (device.uuid == uuid)
						return device;
				}
			}
			return null;
		}

		public static List<Device> findListByUuid(List<string> uuids)
		{
			List<Device> list = new List<Device>();
			foreach (string uuid in uuids)
			{
				list.Add(findByUuid(uuid));
			}
			return list;
		}

		// 保存
		public static void save(Device source, Device dto)
		{
			source.nickName = dto.nickName;
			source.brand = dto.brand;
			for (int i = 0; i < source.childDevices.Count; i++)
			{
				source.childDevices[i].nickName = dto.childDevices[i].nickName;
			}
		}

		// 添加
		public static void append(Device device, DeviceGroup group)
		{
            /* [g1.s2] 追加新的设备 */
            if (!IsCanNew(device))
            {
                /* [g1.s6] */
                //View.ViewUtils.showAlert("一个工程中最多设置" + MaxExTypeInProc.ToString() + "个" + device.type.exType.ToString()
                //    + "设备！" + " 当前数目为" + MaxExTypeInProc.ToString() + "个。\r\n");
                View.ViewUtils.showAlert("工程中的" + device.type.name + "设备数量已达到上限！新设备创建失败！");
                /* end of [g1.s6] */
                RestrictErr = true; /* 设置约束错误标记 */
                return;
            }
            else
                RestrictErr = false;
            /* end of [g1.s2] */
			group.devices.Add (device);
		}
		public static Device append(DeviceType type, DeviceGroup group)
		{
			Device dev = DeviceTypeService.getDeviceCreator().create(type);

            /* [g1.s7] 追加新的设备 */
            if (!IsCanNew(dev))
            {
                /* [g1.s8] */
                //View.ViewUtils.showAlert("一个工程中最多设置" + MaxExTypeInProc.ToString() + "个"+ dev.type.exType.ToString() 
                //    + "设备！" + " 当前数目为" + MaxExTypeInProc.ToString() + "个。\r\n");
                View.ViewUtils.showAlert("工程中的" + type.name + "设备数量已达到上限！新设备创建失败！");
                /* end of [g1.s8] */
                RestrictErr = true; /* 设置约束错误标记 */
                return null;
            }
            else
                RestrictErr = false;
            /* end of [g1.s7] */
			group.devices.Add(dev);
			return dev;
		}

		// 删除
		public static void remove(Device device)
		{
            /* [g2.s1] 卸载自身的映射关系 */

			// 卸载映射关系
            //if (device.type.subDeviceType != null)
            //{
            //    foreach (Device subdev in device.childDevices)
            //    {
            //        resetByRemoveDevice (subdev);
            //    }
            //}
            //else
            //{
            //    resetByRemoveDevice (device);
            //}

            if (device.childDevices.Count > 0)
            {
                foreach (Device sub in device.childDevices)
                {
                    resetByRemoveDevice(sub);
                }
            }
            else
            {
                resetByRemoveDevice(device);
            }

            /* end of [g2.s1] */
			// 从设备组中删除
			foreach (DeviceGroup dg in proj.deviceGroups)
			{
				if (dg.devices.Contains (device))
				{
					dg.devices.Remove (device);
					return;
				}
			}
		}

		// 添加新子设备
		public static Device appendNewSub(Device device)
		{
			Device sub = new Device();
			sub.nickName = "分机" + (device.childDevices.Count + 1);
			sub.type = device.type.subDeviceType;

            /* [g4.s1]判断是否可以创建子设备 */

            if (!IsCanNew(sub))
            {
                return null;
            }

            /* end of [g4.s1] */
			device.childDevices.Add(sub);
			return sub;
		}

		// 删除子设备
        /* [g5.s1]将删除状态返回 */
		//public static void removeSub(Device device, Device sub)
        public static bool removeSub(Device device, Device sub)
        /* end of [g5.s1] */
		{

            /* [g3.s4] */

            if (device.type.exType != ExDeviceType.NULL && GetCurNumByType(sub.type.name) == 1)
            {
                View.ViewUtils.showAlert("分机数量不能小于1！删除分机失败！");
                return false;
            }

            /* end of [g3.s4] */
			// 卸载映射关系
			resetByRemoveDevice (sub);

			// 从设备组中删除
			device.childDevices.Remove (sub);
            return true;
		}

		// 卸载负载及场景关系
		private static void resetByRemoveDevice(Device device)
		{
			// 卸载场景关系

			foreach (Scene scene in proj.scenes)
			{
                /* [g7.s1] 优化删除代码 */
                ///* [g6.s1] */
                //int idx = 0;
                //foreach (SceneEvent evet in scene.events)
                //{
                //    if (evet.getDevice() == device)
                //        //scene.events.Remove(evet);
                //        break;
                //    idx++;
                //}
                //if(idx < scene.events.Count)
                //    scene.events.RemoveAt(idx);
                ///* end of [g6.s1] */
                DeleteMember<SceneEvent>(scene.events, null, new CompareDele<SceneEvent>((SceneEvent T1, SceneEvent T2) =>
                {
                    return T1.device == device.uuid;
                }));
                
                    /* end of [g7.s1] */
			}
            /* [g2.s2] 卸载外部信号关系 */
			// 卸载外部信号关系
            //if (device.type.canButtonCtrl && device.connectedPins.Count > 0)
            //{
            //    Panel pinPanel = device.getConnnectedPins () [0].getPanel ();
            //    if (pinPanel.type.hasSignalModel && pinPanel.signal.sconst != SignalConst.NULL)
            //    {
            //        Scene scene = SceneService.findByUuid(pinPanel.signal.scene);
            //        foreach(SceneEvent evet in scene.events)
            //        {
            //            if (evet.getDevice() == device)
            //                scene.events.Remove(evet);
            //        }
            //    }
            //}

            if (device.type.canButtonCtrl && device.connectedPins.Count > 0)
            {
                Panel pnl = device.getConnnectedPins()[0].getPanel();
                if(pnl.type.hasSignalModel && pnl.signal.sconst != SignalConst.NULL)
                {
                    if (pnl.signal.localScene != null )
                    {
                        /* [g7.s2]优化删除代码 */
                        //foreach (SceneEvent e in pnl.signal.localScene.events)
                        //{
                        //    if (e.getDevice() == device)
                        //        pnl.signal.localScene.events.Remove(e);
                        //}
                        DeleteMember<SceneEvent>(pnl.signal.localScene.events, null, new CompareDele<SceneEvent>((SceneEvent T1, SceneEvent T2) =>
                        {
                            return T1.device == device.uuid;
                        }));
                        /* end of [g7.s2] */
                    }
                }
            }
            /* end of [g2.s2] */


            /* [g2.s3] 卸载按键映射关系 */
			// 卸载按键映射关系
            //foreach(HR60_PanelSoft.Model.Net net in proj.nets)
            //{
            //    foreach (Panel panel in net.panels)
            //    {
            //        foreach (PanelPage page in panel.pages)
            //        {
            //            foreach (PanelButton btn in page.buttons)
            //            {
            //                if (btn.getMappingDevice() == device) 
            //                {
            //                    btn.mappingDevice = null;
            //                }
            //            }
            //        }

            //        // 卸载高级页面关系
            //        ExPanelPage exp = panel.getExPageByType(device.type.exType);
            //        if (exp != null && exp.getMappingSubExDevice().Contains (device))
            //        {
            //            exp.mappingSubExDevice.Remove (device.uuid);
            //        }
            //    }
            //}
            foreach (HR60_PanelSoft.Model.Net n in proj.nets)
            {
                //卸载按键
                foreach (Panel p in n.panels)
                {
                    foreach (PanelPage pp in p.pages)
                    {
                        foreach (PanelButton pb in pp.buttons)
                        {
                            if (pb.getMappingDevice() == device)
                            {
                                pb.mappingDevice = null;
                            }
                        }
                    }

                    //卸载高级页
                    ExPanelPage exp = p.getExPageByType(device.type.exType);
                    if (exp != null)
                    {
                        //List<Device> ldev = exp.getMappingSubExDevice();
                        List<string> ldev = exp.mappingSubExDevice;
                        if (ldev != null)
                        {
                            //if(ldev.Contains(device))
                            foreach (Device sub in device.childDevices)
                            {
                                if (ldev.Contains(sub.uuid))
                                {
                                    exp.mappingSubExDevice.Remove(sub.uuid);
                                }
                            }
                        }
                    }
                    
                }

            }
            
            /* end of [g2.s3] */
            /* [g2.s4] 卸载负载关系 */
			// 卸载负载关系
            //foreach (Pin pin in device.getConnnectedPins())
            //{
            //    pin.connectedDevice = null;
            //    pin.isMainPin = false;
            //}
            //device.connectedPins.Clear ();
            if (device.connectedPins.Count > 0)
            {
                foreach (Pin p in device.getConnnectedPins())
                {
                    p.connectedDevice = null;
                    p.isMainPin = true; //reset Pin.isMainPin to true;
                }
                device.connectedPins.Clear();
            }
            /* end of [g2.s4] */
		}


        /*[g1.s9]优化IsCanNew*/
        private static int GetCurNumByType(string typeName)
        {
            int rst = 0;
            foreach (DeviceGroup dg in proj.deviceGroups)
            {
                foreach (Device d in dg.devices)
                {
                    if (d.type.name == typeName)
                    {
                        rst++;
                    }
                    if (d.childDevices.Count > 0)
                    {
                        foreach (Device sub in d.childDevices)
                        {
                            if (sub.type.name == typeName)
                            {
                                rst++;
                            }
                        }
                    }
                }
            }
            return rst;
        }
        /// <summary>
        /// 新建设备时，进行业务逻辑约束
        /// </summary>
        /// <param name="ins">新建的设备对象</param>
        /// <returns>返回结果</returns>
        public static bool IsCanNew(HR60_PanelSoft.Model.BaseModel.RefModel ins)
        {
            //bool rst = true;
            int tempExNum = 0;
            /* [g1.s4] 多楼层机 */
            int tempMfmNum = 0, tempMfsNum = 0;
            /* end of [g1.s4] */

            /* [g3.s1]创建多种约束条件 */
            int tempAirCtrlNum = 0, tempNewWindNum = 0, tempHeatNum = 0, tempBGMNum = 0;

            /* end of [g3.s1] */

            /* [g1.s10] 智能终端（灯光窗帘） */
            int tempQ6Num = 0;
            /* end of [g1.s10] */
            Device dev = (Device)ins;
            if (dev.type.exType != ExDeviceType.NULL)  /* 约束ExDev设备 */
            {
                /* 约束高级设备同类型唯一 */

                foreach (DeviceGroup dg in proj.deviceGroups)
                {
                    foreach (Device d in dg.devices)
                    {
                        if (d.type.exType == dev.type.exType)
                        {
                            tempExNum++;
                            if (tempExNum >= MaxExTypeInProc)
                                return false;
                            else
                                continue;
                        }
                    }
                }
                return true;
            }

            switch (dev.type.name)
            {
                /* [g1.s5] */
                case "多楼层主机":
                    tempMfmNum = GetCurNumByType(dev.type.name);
                    if (tempMfmNum > MaxMultiFloorMain)
                    {
                        //GCERR:
                        return false;
                    }
                    else if (tempMfmNum == MaxMultiFloorMain)
                        return false;
                    return true;
                case "多楼层从机":
                    tempMfsNum = GetCurNumByType(dev.type.name);
                    if (tempMfsNum == 0)
                    {
                        tempMfmNum = GetCurNumByType("多楼层主机");
                        if (tempMfmNum == 0)
                        {
                            View.ViewUtils.showAlert("当前多楼层主机设备数为0，不可创建多楼层分机！");
                            return false;
                        }
                    }
                    if (tempMfsNum > MaxMultiFloorSlave)
                    {
                        //GCERR:
                        return false;
                    }
                    else if (tempMfsNum == MaxMultiFloorSlave)
                        return false;
                    return true;
                /* end of [g1.s5] */
                /* [g4.s1]将智能终端的检测，移到PinItem类中 */
                case "智能终端（灯光窗帘）":
                    /* [g1.s11] Q6 面板约束 */
                    //bool tempHasQ6 = true;
                    //foreach (Net n in proj.nets)
                    //{
                    //    tempHasQ6 = false;
                    //    foreach (Panel p in n.panels)
                    //    {
                    //        if (p.type.name == "HK-60Q6CW")
                    //        {
                    //            tempHasQ6 = true;
                    //            break;
                    //        }
                    //    }
                    //    if (!tempHasQ6)
                    //    {
                    //        View.ViewUtils.showAlert("在创建智能终端（灯光窗帘）设备之前，"+
                    //            "必须确保每个子网包含一个Q6面板！创建设备失败！");
                    //        return false;
                    //    }
                    //}
                    /* end of [g1.s11] */

                    /* [g1.s12]智能终端（全部功能）设备约束 */
                    //bool tempHasTypeZNZDAll = false;
                    //foreach (Net n in proj.nets)
                    //{
                    //    foreach (Panel p in n.panels)
                    //    {
                    //        if (p.type.name == "HK-60Q6CW")
                    //        {
                    //            if (p.m485Pin.getConnectedDevice().type.name == "智能终端（全部功能）")
                    //            {
                    //                tempHasTypeZNZDAll = true;
                    //                break;
                    //            }
                    //        }
                    //    }
                    //    if (tempHasTypeZNZDAll)
                    //        break;
                    //}
                    //if (!tempHasTypeZNZDAll)
                    //    return true;
                    //else
                    //{
                    //    View.ViewUtils.showAlert("当前项目中，已经关联了智能终端（全部功能）设备，" +
                    //        "不能再创建智能终端（灯光窗帘）设备！");
                    //    return false;
                    //}
                    /* end of [g1.s12] */
               case "智能终端（全部功能）":
                    /* [g1.s13] Q6 面板约束*/
                    //bool tempHasQ61 = true;
                    //foreach (Net n in proj.nets)
                    //{
                    //    tempHasQ61 = false;
                    //    foreach (Panel p in n.panels)
                    //    {
                    //        if (p.type.name == "HK-60Q6CW")
                    //        {
                    //            tempHasQ61 = true;
                    //            break;
                    //        }
                    //    }
                    //    if (!tempHasQ61)
                    //    {
                    //        View.ViewUtils.showAlert("在创建智能终端（全部功能）设备之前，" +
                    //            "必须确保每个子网包含一个Q6面板！创建设备失败！");
                    //        return false;
                    //    }
                    //}
                    /* end of [g1.s13] */
                    break;
                    /* [g3.s2] */
                  /* end of [g4.s1] */
                case "中央空调系统分机-温控器型":
                case "中央空调分机-485型":
                    tempAirCtrlNum = GetCurNumByType(dev.type.name);
                    if (tempAirCtrlNum > MaxACSub)
                    {
                        //GCERR:
                        return false;
                    }
                    else if (tempAirCtrlNum == MaxACSub)
                    {
                        View.ViewUtils.showAlert("当前空调分机设备数为32，不可创建空调分机！");
                        return false;

                    }

                    break;
                case "中央供暖系统分机-温控器型":
                case "中央供暖系统分机-485型":
                    tempHeatNum = GetCurNumByType(dev.type.name);
                    if (tempHeatNum > MaxACSub)
                    {
                        //GCERR:
                        return false;
                    }
                    else if (tempHeatNum == MaxACSub)
                        return false;
                    break;
                case "新风系统分机-温控器型":
                case "新风系统分机-485型":
                    tempNewWindNum = GetCurNumByType(dev.type.name);
                    if (tempNewWindNum > MaxACSub)
                    {
                        //GCERR:
                        return false;
                    }
                    else if (tempNewWindNum == MaxACSub)
                        return false;
                    break;
                case "背景音乐系统分机-485型":
                    tempBGMNum = GetCurNumByType(dev.type.name);
                    if (tempBGMNum > MaxACSub)
                    {
                        //GCERR:
                        return false;
                    }
                    else if (tempBGMNum == MaxACSub)
                        return false;
                    break;
                    /* end of [g3.s2] */
                default:
                    break;

            }

            //foreach (DeviceGroup dg in proj.deviceGroups)
            //{
            //    foreach (Device d in dg.devices)
            //    {
            //        if (d.type.exType == dev.type.exType && dev.type.exType != ExDeviceType.NULL)
            //        {
            //            tempExNum++;
            //            if (tempExNum >= MaxExTypeInProc)
            //                return false;
            //            else
            //                continue;
            //        }

            //        //if(d.type.name == "多楼层主机")
            //        //{
            //        //    tempMfmNum++;
            //        //    if (tempMfmNum > MaxMultiFloorMain)
            //        //    {
            //        //        //GCERR:
            //        //        return false;
            //        //    }
            //        //    else if(tempMfmNum == MaxMultiFloorMain)
            //        //        return false;
            //        //    return true;
            //        //}
            //        //else if (d.type.name == "多楼层从机")
            //        //{
            //        //    tempMfsNum++;
            //        //    if (tempMfsNum > MaxMultiFloorSlave)
            //        //    {
            //        //        //GCERR:
            //        //        return false;
            //        //    }
            //        //    else if (tempMfsNum == MaxMultiFloorSlave)
            //        //        return false;
            //        //    return true;
            //        //}
                   
            //    }
            //}
            return true;
        }

        /* end of [g1.s9]*/
	
	}
}

